/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.mindbox.mueblesalpes.presentacion.cliente;

import com.mindbox.mueblesalpes.negocio.cliente.ClienteServiceLocal;
import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.TipoDocumento;
import com.mindbox.mueblesalpes.negocio.entity.Ciudad;
import com.mindbox.mueblesalpes.negocio.entity.Departamento;
import com.mindbox.mueblesalpes.negocio.entity.Pais;
import com.mindbox.mueblesalpes.negocio.entity.TarjetaCredito;
import com.mindbox.mueblesalpes.negocio.exception.TiendaException;
import com.mindbox.mueblesalpes.negocio.persistence.TarjetaCreditoLocal;
import com.mindbox.mueblesalpes.negocio.utilidades.IUtilidades;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import com.mindbox.mueblesalpes.presentacion.utils.ReglasNavegacion;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import org.richfaces.component.html.HtmlDataTable;

/**
 * Backing Bean de la página de búsqueda
 * @author Diana Carolina
 */
public class ClienteListBean {
    
    private Mensajes mensaje;
    private String tipoDocumento;
    private String numeroDocumento;
    private String nombreCompleto;
    private String telefonoResidencia;
    private String direccion;
    private String ciudadResidencia;
    private String profesion;
    private String email;
    private String departamento;
    private String pais;
    private List<Cliente> listadoClientes;
    private HtmlDataTable tabla;
    private boolean mostrarTabla;
    private int seleccion;
     @EJB
    private ClienteServiceLocal clienteEjb;
     @EJB
    private IUtilidades utilidades;


    public ClienteListBean(){
    }
    @PostConstruct
    public void init(){
        listadoClientes = new ArrayList<Cliente>();
        tabla = new HtmlDataTable();
        listadoClientes = clienteEjb.mostrarClientes();
        mensaje = new Mensajes();
        mostrarTabla = false;
        seleccion = 0;
    }
    /**
     * Muestra un listado de tipos de documento
     * @return
     */
    public Map getListaTiposDocumento(){
        Map tipoDoc = new TreeMap();
        tipoDoc.put("", "Seleccionar");
        for(Object o: utilidades.consultarTipoDocumento()){
            tipoDoc.put(o.toString(), o.toString());
        }
        return tipoDoc;
    }
    /**
     * Método que carga el listado de países
     * @return Map con los nombres de países
     */
    public Map getListaPaises() {
        Map paises = new TreeMap();
        paises.put("", "Seleccionar");
        for (Pais p : utilidades.consultarPaises()) {
            paises.put(p.getPais(), p.getIdPais());
        }
        return paises;

    }
     /**
      * Obtiene un listado de ciudades
      * @return
      */
    public Map getListaCiudades(){
        Map ciudades = new TreeMap();
        ciudades.put("", "Seleccionar");
        for(Ciudad c: utilidades.consultarCiudades()){
            ciudades.put(c.getNombre(), c.getIdCiudad());
        }
        return ciudades;
    }
    /**
     * Obtiene el listado de departamentos
     * @return
     */
    public Map getListaDepartamento(){
        Map departamentos = new TreeMap();
        departamentos.put("", "Seleccionar");
       for(Departamento d: utilidades.consultarDepartamentos()){
            departamentos.put(d.getNombre(), d.getIdDepartamento());
        }
        return departamentos;
    }
    /**
     * Obtiene el listado de tipos de usuario
     * @return
     */
    public Map getTiposUsuario(){
        Map tiposUsuario = new TreeMap();
        tiposUsuario.put("", "Seleccionar");
        for(Object o: utilidades.consultarTipoUsuarios()){
            tiposUsuario.put(o.toString(), o.toString());
        }
        return tiposUsuario;
    }
    /**
     * Obtiene el valor del campo ciudad de residencia
     * @return
     */
    public String getCiudadResidencia() {
        return ciudadResidencia;
    }
    /**
     * Asigna el valor del campo ciudad de residencia
     * @param ciudadResidencia
     */
    public void setCiudadResidencia(String ciudadResidencia) {
        this.ciudadResidencia = ciudadResidencia;
    }
    /**
     * Obtiene el valor del campo departamento
     * @return
     */
    public String getDepartamento() {
        return departamento;
    }
    /**
     * Asigna el valor del campo departamento
     * @param departamento
     */
    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }
    /**
     * Asigna el valor del campo dirección
     * @return
     */
    public String getDireccion() {
        return direccion;
    }
    /**
     * Asigna el valor del campo dirección
     * @param direccion
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }
    /**
     * Obtiene el valor del campo email
     * @return
     */
    public String getEmail() {
        return email;
    }
    /**
     * Asigna el valor del campo email
     * @param email
     */
    public void setEmail(String email) {
        this.email = email;
    }
    /**
     * Obtiene el valor de Mensaje
     * @return
     */
    public Mensajes getMensaje() {
        return mensaje;
    }
    /**
     * Asigna el valor a Mensaje
     * @param mensaje
     */
    public void setMensaje(Mensajes mensaje) {
        this.mensaje = mensaje;
    }
    /**
     * Obtiene el nombre completo del usuario
     * @return
     */
    public String getNombreCompleto() {
        return nombreCompleto;
    }
    /**
     * Asigna el nombre completo del usuario
     * @param nombreCompleto
     */
    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }
    /**
     * Obtiene el valor del campo número documento
     * @return
     */
    public String getNumeroDocumento() {
        return numeroDocumento;
    }
    /**
     * Asigna el valor al campo número documento
     * @param numeroDocumento: representa el número de documento de identificación del usuario
     */
    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }
    /**
     * Obtiene el valor del campo país
     * @return
     */
    public String getPais() {
        return pais;
    }
    /**
     * Asigna el valor al campo país
     * @param pais
     */
    public void setPais(String pais) {
        this.pais = pais;
    }
    /**
     * Obtiene el valor del campo profesión
     * @return
     */
    public String getProfesion() {
        return profesion;
    }
    /**
     * Asigna el valor al campo profesión
     * @param profesion
     */
    public void setProfesion(String profesion) {
        this.profesion = profesion;
    }
    /**
     * Obtiene el valor del campo teléfono de residencia
     * @return
     */
    public String getTelefonoResidencia() {
        return telefonoResidencia;
    }
    /**
     * Asigna el valor al campo teléfono de residencia
     * @param telefonoResidencia
     */
    public void setTelefonoResidencia(String telefonoResidencia) {
        this.telefonoResidencia = telefonoResidencia;
    }
    /**
     * Obtiene el tipo de documento de identificación del usuario
     * @return
     */
    public String getTipoDocumento() {
        return tipoDocumento;
    }
    /**
     * Asigna el valor del campo tipo de documento
     * @param tipoDocumento
     */
    public void setTipoDocumento(String tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }
    /**
     * Obtiene los datos del listado de clientes
     * @return
     */
    public List<Cliente> getListadoClientes() {
        return listadoClientes;
    }
    /**
     * Asinga el los datos al listado de clientes
     * @param listadoClientes
     */
    public void setListadoClientes(List<Cliente> listadoClientes) {
        this.listadoClientes = listadoClientes;
    }
    /**
     * Obtiene la tabla que muestra el resultado de la consulta
     * @return
     */
    public HtmlDataTable getTabla() {
        return tabla;
    }
    /**
     * Asigna la tabla
     * @param tabla
     */
    public void setTabla(HtmlDataTable tabla) {
        this.tabla = tabla;
    }

    /**
     * Realiza la búsqueda de clientes
     * @return
     */
    public String buscarCliente(){
        try{
            Cliente cliente = new Cliente();
           if(tipoDocumento.equals(TipoDocumento.CEDULA.toString())){
                cliente.setTipoDocumento(TipoDocumento.CEDULA);
            }
            if(tipoDocumento.equals(TipoDocumento.NIT.toString())){
                cliente.setTipoDocumento(TipoDocumento.NIT);
            }
            if(numeroDocumento != null && !numeroDocumento.equals("")){
                cliente.setNumeroDocumento(numeroDocumento);
            }
            if(nombreCompleto != null && !nombreCompleto.equals("")){
                cliente.setNumeroDocumento(numeroDocumento);
            }
            if(telefonoResidencia != null && !telefonoResidencia.equals("")){
                cliente.setTelefonoResidencia(telefonoResidencia);
            }
            if(direccion != null && !direccion.equals("")){
                cliente.setDireccion(direccion);
            }
            
            if(email != null && !email.equals("")){
                cliente.setEmail(email);
            }
            
            listadoClientes = clienteEjb.consultarCliente(cliente);
            this.setMostrarTabla(true);

        }catch(Exception e){
            Mensajes.asignarMensajeError("search.error");
        }
        return null;
    }
    /**
     * Realiza la edición de los datos de un cliente específico
     * @return
     */
    public String editarCliente(){
        int seleccion = (Integer) tabla.getRowKey();

        if (seleccion > listadoClientes.size()) {
            return null;
        }
        Cliente clienteSeleccionado = (Cliente)listadoClientes.get(seleccion);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.getExternalContext().getSessionMap().put("ClienteEdit", clienteSeleccionado);
        return ReglasNavegacion.editar_datos_usuario.toString();
    }
    /**
     * Realiza la eliminación de un cliente específico
     * @return
     */
    public String borrarCliente()
    {
        System.out.println("A BORRAR!!!");
        //int seleccion = (Integer) tabla.getRowKey();

        if (seleccion > listadoClientes.size()) {
            return null;
        }
        Cliente clienteSeleccionado = (Cliente)listadoClientes.get(seleccion);
        clienteEjb.eliminarCliente(clienteSeleccionado);
        listadoClientes = clienteEjb.mostrarClientes();

        return "list_clientes";
    }
    /**
     * Obtiene el cliente que va a ser eliminado
     * @return
     */
    public String obtenerClienteEliminar(){
        try{
            seleccion = (Integer) tabla.getRowKey();

        }catch(Exception e){
            Mensajes.asignarMensajeError("search.delete.error");
        }
        return null;
    }
    /**
     * Retorna a la pádina de creación de clientes, es la acción del botón
     * Crear cliente mostrado en la pantalla
     * @return
     */
    public String crearCliente(){
        return ReglasNavegacion.insert_clientes.toString();
    }

    /**
     * Retorna a la página de creación ó edición de tarjeta de crédito
     *
     * @return
     */
    public String crearTarjetaCredito(){

        try {
            obtenerClienteEliminar();
            if (seleccion > listadoClientes.size()) {
                return null;
            }
            Cliente clienteSeleccionado = (Cliente)listadoClientes.get(seleccion);
           
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.getExternalContext().getSessionMap().put("ClienteSeleccionado", clienteSeleccionado);
            
        } catch(Exception e){
            Mensajes.asignarMensajeAdvertencia("Se ha presentado un error inesperado");
        }
        return ReglasNavegacion.tarjeta_credito.toString();
    }
    /**
     * Asigna el valor al atributo que permite saber si se muestra o no la tabla
     * con los resultados de la búsqueda
     * @return
     */
    public boolean isMostrarTabla() {
        return mostrarTabla;
    }
    /**
     * Asigna un valor al atributo que permite saber si se muestra o no la tabla
     * con los resultados de la búsqueda
     * @param mostrarTabla
     */
    public void setMostrarTabla(boolean mostrarTabla) {
        this.mostrarTabla = mostrarTabla;
    }
    public String cancelar(){
        return "";
    }
    
}
